
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of CorrelativosData.
	/// </summary>
	public class CorrelativosData : Singleton<CorrelativosData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Correlativos table by a foreign key.
		/// </summary>
		public IList<Correlativos> Listar()
		{
			var entidades = new List<Correlativos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllCorrelativos");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Correlativos
					{
						correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID"))? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
						tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento"))? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
						serie = lector.IsDBNull(lector.GetOrdinal("serie"))? default(string) : lector.GetString(lector.GetOrdinal("serie")),
						numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
						numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
						numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
					});
				}
			}
			comando.Dispose();
			return entidades;
        }

        /// <summary>
        /// Selects all records from the Correlativos table by a foreign key.
        /// </summary>
        public IList<Correlativos> ListarActivos()
        {
            var entidades = new List<Correlativos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectCorrelativosActivos");

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Correlativos
                    {
                        correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
                        tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento")) ? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
                        serie = lector.IsDBNull(lector.GetOrdinal("serie")) ? default(string) : lector.GetString(lector.GetOrdinal("serie")),
                        numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
                        numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
                        numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Correlativos table by a foreign key.
        /// </summary>
        public Correlativos ObtenerActivoByTipoDocumento(byte tipoDocumento)
        {
            var correlativos = default(Correlativos);
            var comando = BaseDatos.GetStoredProcCommand("SelectFirstCorrelativosActivosByTipo");
            BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.Byte, tipoDocumento);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                if (lector.Read())
                {
                    correlativos = new Correlativos
                    {
                        correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
                        tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento")) ? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
                        serie = lector.IsDBNull(lector.GetOrdinal("serie")) ? default(string) : lector.GetString(lector.GetOrdinal("serie")),
                        numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
                        numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
                        numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
                    };
                }
            }
            comando.Dispose();
            return correlativos;
        }

        /// <summary>
        /// Selects all records from the Correlativos table by a foreign key.
        /// </summary>
        public IList<Correlativos> ListarByTipoDocumento(byte tipoDocumento)
        {
            var entidades = new List<Correlativos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectCorrelativosByTipoDocumento");
            BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.Byte, tipoDocumento);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Correlativos
                    {
                        correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
                        tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento")) ? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
                        serie = lector.IsDBNull(lector.GetOrdinal("serie")) ? default(string) : lector.GetString(lector.GetOrdinal("serie")),
                        numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
                        numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
                        numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Correlativos table by a foreign key.
        /// </summary>
        public Correlativos ObtenerByTipoAndSerie(byte tipoDocumento, string serie)
        {
            Correlativos entidad = default(Correlativos);
            var comando = BaseDatos.GetStoredProcCommand("SelectCorrelativosByTipoAndSerie");
            BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.Byte, tipoDocumento);
            BaseDatos.AddInParameter(comando, "serie", DbType.String, serie);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                if (lector.Read())
                {
                    entidad = new Correlativos
                    {
                        correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
                        tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento")) ? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
                        serie = lector.IsDBNull(lector.GetOrdinal("serie")) ? default(string) : lector.GetString(lector.GetOrdinal("serie")),
                        numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
                        numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
                        numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
                    };
                }
            }
            comando.Dispose();
            return entidad;
        }

        /// <summary>
        /// Selects all records from the Correlativos table by a foreign key.
        /// </summary>
        public IList<Correlativos> ListarEntreNumeros(byte tipoDocumento, int numeroInicio, int numeroFinal)
        {
            var entidades = new List<Correlativos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectCorrelativosBetweenNumeros");
            BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.Byte, tipoDocumento);
            BaseDatos.AddInParameter(comando, "numeroInicio", DbType.Int32, numeroInicio);
            BaseDatos.AddInParameter(comando, "numeroFinal", DbType.Int32, numeroFinal);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Correlativos
                    {
                        correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
                        tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento")) ? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
                        serie = lector.IsDBNull(lector.GetOrdinal("serie")) ? default(string) : lector.GetString(lector.GetOrdinal("serie")),
                        numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
                        numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
                        numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual")) ? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		/// <summary>
		/// Selects all records from the Correlativos table by a foreign key.
		/// </summary>
		public Correlativos Obtener(int correlativoID)
		{
			var correlativos = default(Correlativos);
			var comando = BaseDatos.GetStoredProcCommand("SelectCorrelativos");

			BaseDatos.AddInParameter(comando, "correlativoID", DbType.Int32, correlativoID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					correlativos = new Correlativos
					{
						correlativoID = lector.IsDBNull(lector.GetOrdinal("correlativoID"))? default(int) : lector.GetInt32(lector.GetOrdinal("correlativoID")),
						tipoDocumento = lector.IsDBNull(lector.GetOrdinal("tipoDocumento"))? default(byte) : lector.GetByte(lector.GetOrdinal("tipoDocumento")),
						serie = lector.IsDBNull(lector.GetOrdinal("serie"))? default(string) : lector.GetString(lector.GetOrdinal("serie")),
						numeroInicio = lector.IsDBNull(lector.GetOrdinal("numeroInicio"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroInicio")),
						numeroFinal = lector.IsDBNull(lector.GetOrdinal("numeroFinal"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroFinal")),
						numeroActual = lector.IsDBNull(lector.GetOrdinal("numeroActual"))? default(int) : lector.GetInt32(lector.GetOrdinal("numeroActual"))
					};
				}
			}
			comando.Dispose();
			return correlativos;
		}

		/// <summary>
		/// Saves a record to the Correlativos table.
		/// </summary>
		public int Agregar(Correlativos correlativos)
		{
            var comando = BaseDatos.GetStoredProcCommand("InsertCorrelativos");
            BaseDatos.AddOutParameter(comando, "correlativoID", DbType.Int32, 4);
			BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.String, correlativos.tipoDocumento);
			BaseDatos.AddInParameter(comando, "serie", DbType.String, correlativos.serie);
			BaseDatos.AddInParameter(comando, "numeroInicio", DbType.Int32, correlativos.numeroInicio);
			BaseDatos.AddInParameter(comando, "numeroFinal", DbType.Int32, correlativos.numeroFinal);
			BaseDatos.AddInParameter(comando, "numeroActual", DbType.Int32, correlativos.numeroActual);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Agregar Correlativos.");

            var valorDevuelto = (int)BaseDatos.GetParameterValue(comando, "correlativoID"); ;
            comando.Dispose();
            return valorDevuelto;
        }

        /// <summary>
        /// Updates a record in the Correlativos table.
        /// </summary>
        public bool Modificar(Correlativos correlativos)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateCorrelativos");
            BaseDatos.AddInParameter(comando, "correlativoID", DbType.Int32, correlativos.correlativoID);
            BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.String, correlativos.tipoDocumento);
            BaseDatos.AddInParameter(comando, "serie", DbType.String, correlativos.serie);
            BaseDatos.AddInParameter(comando, "numeroInicio", DbType.Int32, correlativos.numeroInicio);
            BaseDatos.AddInParameter(comando, "numeroFinal", DbType.Int32, correlativos.numeroFinal);
            BaseDatos.AddInParameter(comando, "numeroActual", DbType.Int32, correlativos.numeroActual);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Modificar Correlativos.");

            comando.Dispose();
            return true;
        }

		/// <summary>
		/// Updates a record in the Correlativos table.
		/// </summary>
		public bool ModificarBase(Correlativos correlativos, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateCorrelativos");
			BaseDatos.AddInParameter(comando, "correlativoID", DbType.Int32, correlativos.correlativoID);
			BaseDatos.AddInParameter(comando, "tipoDocumento", DbType.String, correlativos.tipoDocumento);
			BaseDatos.AddInParameter(comando, "serie", DbType.String, correlativos.serie);
			BaseDatos.AddInParameter(comando, "numeroInicio", DbType.Int32, correlativos.numeroInicio);
			BaseDatos.AddInParameter(comando, "numeroFinal", DbType.Int32, correlativos.numeroFinal);
			BaseDatos.AddInParameter(comando, "numeroActual", DbType.Int32, correlativos.numeroActual);

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Modificar Correlativos.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Correlativos table by its primary key.
		/// </summary>
		public bool Eliminar(int correlativoID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteCorrelativos");
			BaseDatos.AddInParameter(comando, "correlativoID", DbType.Int32, correlativoID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Correlativos.");
			comando.Dispose();
			return true;
		}

		#endregion
	}
}
